你跟我一樣有有時候太忙或剛好出國玩可能就會忘記檢查自己的email信箱導致沒看到信用卡帳單進而錯過繳費的情況嗎?
透過自動化的幫忙你可以不用再手動檢查信用卡帳單pdf了,自動化可以直接幫你
接下來我們就來看怎麼做吧!
首先你需要有一套強大的RPA自動化軟體,這邊我們用台灣新創開發的Emily.RPA來做示範,
如何下載安裝可以參考: 軟體下載 Download the software | EMILY.RPA
進入RPA後我們先點選訓練模式,清除工作資料夾
由於等等要辨識帳單pdf,我們要準備自己身份證字號的txt檔當成PDF密碼防止身分證存在EMILY中,準備好後可以透過"匯入檔案"先匯入檔案讓將來EMILY需要密碼時可以讀取該檔案。
選擇Email讀取模組
Email模組的設定可以參考以下兩個影片:
設定好後(以gmail為例)
上方會如下圖:
再來我們加上程式碼去找指定的,包含我們信用卡帳單的資訊:
input.forEach((mail) => {
if (mail.subject.startsWith('國泰世華銀行信用卡') && mail.subject.endsWith('電子帳單'))
{
console.log(mail)
if (mail.attachments.length > 0) {
mail.attachments.forEach((att) =>
{
if (att.filename.endsWith('pdf')) {
api.write(att.filename, att.content)
api.write('unpaid.txt', att.filename)}
})
}
}
})
以上程式碼屬於JavaScript,相關函式跟範例可以參考: Mail Reader - Online Document (emily.tips)
forEach,startsWith跟.endsWith都是JavaScript的函式,不清楚可以參考MDN的文件或是直接問ChatGPT。
整段意思是說找出我們信箱中標題的開頭是'國泰世華銀行信用卡'且結尾是'電子帳單'的信,為什麼呢?因為信箱中的會收到國泰世華開頭的信可能不只是信用卡帳單信,可能也會收到行銷信或是對帳單之類的,所以在結尾再加上電子帳單字眼讓我們可以精準抓到我們要的信,如果你是抓其他銀行的信的話就要改成其他字眼例如我們要抓中國信託銀行的話
程式碼中間可以改成:
if (mail.subject.startsWith('中國信託信用卡電子帳單'))
而第二段的意思則是去下載符合條件的email的附件。程式依照自己的需求改完後可以按右上角的DEBUG,再按console,然後按下TEST,看能不能正確抓到那封信,抓的到話會在console可以看到
抓不到的話可能是
另外可以點選小視窗的工作資料夾看附件檔案有沒有正確被下載,有的話我們就可以儲存這個步驟了。
接下來我們要使用另一個模組,點選"前往網址" > "pdf analyzer"
來解析剛剛的附件,先在密碼的地方打上環境變數輸入剛剛匯入的身份證字號,pick選擇剛剛工作資料夾的pdf,選完之後切到view,可以看到我們可以解析的文字區塊都被標成紅底
而我們可以透過這些文字內容來定位,可以滑鼠移到某個文字物件上,按住shift加上往下鍵,可以看到指向下方的文字物件了
然後回到Train按貼上可以看到剛剛想抓的文字物件變成程式碼了。我們就可以用這個方法找到我們要的文字物件。
通常會找固定不變的文字,例如上方的先生,因為pdf模組可以根據關鍵字直接找到文字內容的位置,如果文字內容總是變動下次會找不到。找到位置後再根據相對位置去找我們要的文字內容,例如本期應繳總額總是會在先生的下方的下方的下方,我們可以打上以下程式碼:
api.closeDate = input.resolve( {"keyName":"先生","keyBounds":{"page":1}, "valPos":"DOWN"})//找"先生"的下面一個文字
api.dl = input.resolve( {"keyName":api.closeDate.text,"keyBounds":{"page":1}, "valPos":"DOWN"}) //繳款截止日
let deadline = api.dl.text.split('/')
let yyyy = parseInt(deadline[0]) + 1911 //將年份改成西元制
let wDate = deadline[1] + '/' + deadline[2] + '/' + yyyy.toString()
api.amount = input.resolve( {"keyName":api.dl.text,"keyBounds":{"page":1}, "valPos":"DOWN"}) //金額
console.log(api.amount.text)
console.log(api.dl.text)
api.write('amount.txt', api.amount.text)
api.write('dl.txt', api.dl.text)
相關程式以及文字定位的方法可以參考:PDF Analyzer - Online Document (emily.tips)
為何不用帳單結帳日,繳款截止日,或是直接抓金額呢?因為這三個資訊每個月總是會變動,無法預期也無法用固定關鍵字搜尋,所以才用先生(女生記得改成小姐)定位。程式中也可以看到繳款截止日已經用類似邏輯定位出來了。
程式最後我們要將抓出來的文字匯出方便後續使用,最後再加上api.write輸出成文字檔即可。
程式依照自己的需求改完後(如果你是其他銀行的帳單定位邏輯會不一樣)可以按右上角的DEBUG,再按console,然後按下TEST,看工作資料夾有沒有多出兩個txt檔以及能不能正確抓到金額跟日期。
抓的到話會在console可以看到,抓不到的話可能是定位問題,可以多用console.log檢查有沒有抓到自己要的文字,或是"keyName":api.dl.text
的VALUE忘記加上.text
變成api.dl
TEST完ok在pick換上環境變數 %unpaid% 讓我們可以抓到裡面原來PDF檔的檔名(這樣就不會受檔案名稱跟絕對路徑的影響)我們就可以儲存這個步驟了。
接下來我們要介紹前面6-II的計算是否需要要補餘額功能如何設計,這邊再使用另一個模組,點選"前往網址" > "EXCEL Writer(excel輸出)",PICK有銀行餘額的資料。
先找到你平常自動扣繳銀行的那一行看一下金額位置, 假設在B2的話我們可以參考:EXCEL Writer - Online Document (emily.tips)用api.getCell('Sheet1', 1, 1))抓出B2的金額,如果金額是在B3的話可以用api.getCell('Sheet1', 2, 1)),而如果金額是在A2的話可以用api.getCell('Sheet1', 1, 0)),依此類推,第一個參數'Sheet1'則是分頁名稱的意思,如果分頁名稱是【餘額】的話記得改成api.getCell('餘額', 1, 1))。
接下來可以打上以下程式碼:
// input{} represents excel workbook object
let balance = api.getCell('balance', 1, 1)
let amount = api.read('amount.txt').replace(/,/g, '')
if (parseInt(balance) < parseInt(amount)) {
let diff = parseInt(amount) - parseInt(balance)
api.setCell('balance', 1, 4, diff)
}
api.setCell('balance', 1, 2, api.read('amount.txt'))
api.setCell('balance', 1, 3, api.read('dl.txt'))
透過 Workspace Script - Online Document (emily.tips) 的api.read('price.txt')
來讀取我們剛剛存好的amount.txt,再透過api.setCell()
寫進我們要的欄位,剩下的程式則是計算是否需要補錢進去以及需要補多少錢還有寫入剛剛繳款截止日。
都確定沒問題後,按DEBUG跟TEST,開啟工作資料夾檢查一下,可以看到我們想填寫的資訊都填進去了。
就可以儲存這個模組
停止整個技能(按左側的結束)
並上傳了。
最後一步為設計讓我們收到信用卡帳單EMAIL就自動觸發這個技能(設定與功能可以參考:https://docs.emily.tips/mailtrigger
),來到EMILY的設定 > 選擇郵件觸發 > 點選新增規則,from填寫是誰寄來時要觸發,subject填寫信件主旨會包含的關鍵字,來信有包含關鍵字時就觸發,所以我們這邊可以填寫 "國泰世華銀行信用卡" ,最下方的就選要觸發的技能,選剛剛設計好的技能。這樣一來每次收到技能就會自動觸發這個技能了!
延伸應用: